package demo3IOliu;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @description: 一、流的分类
 * 1、操作数据单位：字节流、字符类
 * 2、数据的流向：输入流、输出流
 * 3、流的角色；节点流、处理流
 * <p>
 * 二、流的体系结构
 * 抽象基类             节点流（或文件流）          缓冲流（处理流的一种）
 * InputStream          FileInputStream         BufferedInputStream
 * OutputStream         FileOutputStream        BufferedOutputStream
 * Reader               FilrReader              BufferedReader
 * Writer               FileWriter              BufferedWriter
 * @author:Mr.Cat
 * @create:2021-11-07 13:57
 **/
public class FileReaderWriterTest {
    @Test
    public void test1() {
        FileReader fr = null;
        try {
            //将文件中的内容读取并输出到控制台
            //实例化File类的对象，指明操作的文件
            File file = new File("Hello.txt");
            //提供具体的流
            fr = new FileReader(file);
            //数据的读入
            //read()：返回读入的一个字符。如果达到文件末尾，返回-1
            //方式一：
        /*int data = fr.read();
        while (data != -1) {
            System.out.print((char) data);
            data = fr.read();
        }*/
            //方式二：语法上的修改
            int data;
            while ((data = fr.read()) != -1) {
                System.out.println((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //流的关闭操作
            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    //对read()的操作升级：使用read的重载方法
    @Test
    public void test2() {
        FileReader fr = null;
        try {
            //实例化File类的实例化
            File file1 = new File("Hello.txt");
            //FileReader流的实例化
            fr = new FileReader(file1);
            //读入的操作
            //read（char[] cbuf）:返回每次读入cbuf数组中的字符个数。如果达到文件末尾，返回-1
            char[] cbuf = new char[5];
            int len;
            while ((len = fr.read(cbuf)) != -1) {
                //方式一：
                /* //错误方法
                 *//* for(int i=0;i<cbuf.length;i++){
                    System.out.print(cbuf[i]);
                }*//*
                //正确的
                for (int i = 0; i < len; i++) {
                    System.out.print(cbuf[i]);
                }*/
                //方式二：
                //错误的
                /*String str = new String(cbuf);
                System.out.print(str);*/
                //正确的方法：
                String str = new String(cbuf, 0, len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //资源的关闭
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    //从内存中写出数据到硬盘的文件里
    /*
     * 1、输出操作，对应的文件可以不存在的。不会报异常
     *
     * 2.如果不存在：在输出的过程中。会自动创建此文件
     * 如果存在：
     *   如果流使用的构造器是：FileWriter(file,false)/FileWriter(file):对原有文件进行覆盖
     *   如果流使用的构造器是：FileWriter(file,true):不会对原文件进行覆盖，而是在原有文件上追加内容
     * */
    @Test
    public void test3() {
        //1提供File类的实例化对象，指明写出到的文件
        FileWriter fw = null;
        try {
            File file = new File("Hello.txt");
            //2提供FileWriter的对象，用于数据的写出
            fw = new FileWriter(file);
            //4写成的操作
            fw.write("JavaYYDS");
            fw.write("数据库最重要");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                try {
                    //4流资源的关闭
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //对文件进行写入与读出
    @Test
    public void test4() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //创建File类的对象，指明读入与写出的文件
            File srcfile = new File("Hello.txt");
            File destfile = new File("Hello2.txt");
            //创建输入流和输出流的对象
            fr = new FileReader(srcfile);
            fw = new FileWriter(destfile);

            //数据的读入与写出操作
            char[] cbuf = new char[5];
            int len;//记录每次读入到cbuf数组中的字符的个数
            while ((len=fr.read(cbuf))!=-1){
                fw.write(cbuf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fr!=null||fw!=null){
                //流资源的关闭
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

